package com.liuhouse.cronjob;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.liuhouse.pojo.Article;
import com.liuhouse.service.IArticleService;
import com.liuhouse.utils.BeanCopyUtils;
import com.liuhouse.utils.RedisCache;
import com.liuhouse.vo.UpdateArticleViewCountVo;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Component
//通过定时任务实现每隔三分钟把redis中的浏览量更新到mysql数据库中
public class UpdateViewCount {

    @Resource
    private RedisCache redisCache;

    @Resource
    private IArticleService articleService;

    //每隔三分钟,把redis的浏览量数据更新到mysql数据库
    //对于 cron表达式 只要知道大概意思 并且知道去哪里找工具生成就可以了
    @Scheduled(cron = "0 0/1 * * * ? ")
    public void updateViewCount(){
        //获取redis中的浏览量，注意得到的viewCountMap是HashMap双列集合
        Map<String, Integer> viewCountMap = redisCache.getCacheMap("article:viewCount");

        System.out.println(viewCountMap);
        //让双列集合调用entrySet方法即可转化为单列集合,然后才能调用stream方法
        List<Article> articles = viewCountMap.entrySet()
                .stream()
                .map(entry -> new Article(Long.valueOf(entry.getKey()), entry.getValue().longValue()))
                .collect(Collectors.toList());//把最终数据转化为List集合

        //把获取到的浏览量数据更新到mysql数据库中 , updateBatchById是mybatisPlus提供的批量操作数据的方法
        //今天遇到一个空指针的问题 主要原因是因为从登录用户那里去获取值,但是不一定登录,所以就会空指针异常
        //所以 最好的方式就是不要去自动填充他 就ok了
        articleService.updateBatchById(articles);
//        List<UpdateArticleViewCountVo> viewCountVos = BeanCopyUtils.copyBeanList(articles, UpdateArticleViewCountVo.class);
//        viewCountVos.forEach(view -> {
//            LambdaUpdateWrapper<Article> updateWrapper = new LambdaUpdateWrapper<Article>().set(Article::getViewCount, view.getViewCount())
//                    .ge(Article::getId, view.getId());
//            articleService.update(updateWrapper);
//        });

        System.out.println("redis的文章浏览量数据已经更新到数据库,现在的时间是:" + LocalTime.now());

    }

}
